<!DOCTYPE html>
<html lang="en-us">

<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

  	<meta property="og:title" content=" 我的博客 &middot;  我的博客" />
  	<meta property="og:site_name" content="我的博客" />
  	<meta property="og:url" content="/my_technology/" />
    
    
    <meta property="og:type" content="website" />
    

  <title>
     我的博客 &middot;  我的博客
  </title>

    <meta name="description" content="这里是付佳康的个人博客" />

    <meta name="HandheldFriendly" content="True" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />

    <link rel="shortcut icon" href="/my_technology/images/favicon.ico">
	  <link rel="apple-touch-icon" href="/my_technology/images/apple-touch-icon.png" />
    
    <link rel="stylesheet" type="text/css" href="/my_technology/css/screen.css" />
    <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Merriweather:300,700,700italic,300italic|Open+Sans:700,400|Inconsolata" />


    
      
          <link href="/my_technology/index.xml" rel="alternate" type="application/rss+xml" title="我的博客" />
      
      
        <link href="/my_technology/index.xml" rel="alternate" type="application/rss+xml" title="我的博客 &middot; 我的博客" />
      
    
    <meta name="generator" content="Hugo 0.68.3" />

    <link rel="canonical" href="/my_technology/" />

     
</head>
<body class="nav-closed">
<div id="particles-js"></div>
  


 <div class="site-wrapper">



<header class="main-header " style="background-image: url(/my_technology/images/user.jpg)">


    

    <nav class="main-nav overlay clearfix">
        
            <a class="blog-logo" href="/my_technology/"><img src="/my_technology/images/user.png" alt="Blog Logo" /></a>
        
        
    </nav>
<div class="vertical">
        <div class="main-header-content inner">
            <h1 class="page-title">
              <a class="btn-bootstrap-2 title-scroll" href="#content">我的博客</a>
          </h1>
          <h2 class="page-description">这里是付佳康的个人博客</h2>
        </div>
</div>
    <a class="scroll-down icon-arrow-left" href="#content"><span class="hidden">Scroll Down</span></a>
</header>

<main id="content" class="content" role="main">
    
    
    
    
    
    

    <div class="extra-pagination inner">
        <nav class="pagination" role="navigation">
	
	    <a class="newer-posts" href="/my_technology/page/2/">&larr; Newer Posts</a>
	
	<span class="page-number">Page 3 of 3</span>
	
</nav>

    </div>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/yanzhengma/">绘制验证码</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>验证码：
    #导入图片库
    #绘画库
    from PIL import ImageDraw
    #字体库
    from PIL import ImageFont
    #图片库
    from PIL import Image
    #随机库
    import random
    #文件流
    import io
    # redis
    import redis
    # 定义IP地址和端口
    host = '127.0.0.1'
    port = 6379
    # 定义链接对象
    r = redis.Redis(host=host, port=port)


    # 自定义图片验证码
    class MyCode(View):
        # 定义rgb随机颜色
        def get_random_color(self):
            R = random.randrange(255)
            G = random.randrange(255)
            B = random.randrange(255)
            return (R, G, B)
        # 定义图片视图
        def get(self, request):
            # 画布
            img_size = (120, 50)
            # 定义图片对象
            image = Image.new('RGB', img_size, 'white')
            # 定义画笔
            draw = ImageDraw.Draw(image, 'RGB')
            # 定义随机生成数字
            source = '0123456789asdfghjklzxcvbnmqwertyuiop'
            # 接收容器
            code_str = ''
            # 进入循环绘制， 获取随机字符4个
            for i in range(4):
                # 获取字母颜色
                text_color = self.get_random_color()
                # 获取随机下标
                tmp_num = random.randrange(len(source))
                # 随机字符串
                random_str = source[tmp_num]
                # 装入容器
                code_str += random_str
                # 绘制字符串
                draw.text((10+30*i, 20), random_str, text_color)
            # 获取缓存区 使用io模块
            buf = io.BytesIO()
            # 将临时图片保存到缓存
            image.save(buf, 'png')
            # 保存随机码
            r.set('code', code_str)
            # 保存session
            request.session['code'] = code_str
            print(r.get('code'))
            # 返回图片
            return HttpResponse(buf.getvalue(), 'image/png')

            code = request.GET.get('code', None)


    使用验证码时：
        接参
        code = request.GET.get('code', None)
        获取验证码
        redis_code = r.get('code')
        转码
        redis_code = redis_code.decode('utf-8')

</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-05-04T21:22:28&#43;08:00">
            4 May 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/redis/">Redis数据类型</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <h3 id="redis-的五种数据类型">Redis 的五种数据类型</h3>
<pre><code>Redis 的五种数据类型
1.String（字符串类型）
    string 是最基本的类型，而且 string 类型是二进制安全意思是redis的string可以包含任何数据。从内部实现来看string可以看作byte数组，最大上限是1G 字节。(可以这样理解:比如jpg 图片或者序列化的对象。) 

2.sorted set (有序集合类型)
     sorted set是有序集合，它在 set的基础上增加了一个顺序属性，每次指定后（修改后），会自动重新按新的值调整顺序。可以理解了有mysql表，一列存value，一列存顺序。 

3.set 类型 (无需集合类型) 
    set 是无序集合，最大可以包含(2 的 32 次方-1)个元素。set 的是通过 hash table 实现的，所以添加，删除，查找的复杂度都是 O(1)。集合的取并集(union)，交集(intersection)，差集(difference)的应用的技术点，通过这些操作可以很容易的实现 SNS 中的好友推荐和 blog的tag 功能，有时间可以试试哟。

4.hash (哈希 类型)
     hash 是一个 string 类型的 field 和 value 的映射表。添加，删除操作都是 O(1)（平均）。hash 特别适合用于存储对象。相对于将对象的每个字段存成单个 string 类型。将一个对象 存储在 hash 类型中会占用更少的内存，并且可以更方便的存取整个对象。 Hash 省内存的原因是 新建一个 hash 对象时开始是用 zipmap（又称为 small hash）来存储的。这个 zipmap 其实并 不是 hash table，但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元 数据存储开销。尽管 zipmap 的添加，删除，查找都是 O(n)，但是由于一般对象的 field 数量都不太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)

5.list (列表类型)
     list 是一个链表结构，可以理解为一个每个子元素都是 string 类型的双向链表。操作中 key 理解为链表的名字。

数据结构外网网站
     https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2020-05-01T22:16:54&#43;08:00">
            1 May 2020
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/sanfang/">新浪微博开放平台使用</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>一、微博设置
  * 注册微博账号
  * 登录微博开放平台。https://open.weibo.com/
  * 进入首页。创建网站接入的应用。创建好以后，可以在“我的应用中查看”
  * 基本信息中的重要数据
      App Key：3035970630
      App Secret：cf1266f23c63aa9f65b3f9182b4e2eaa
  * 高级信息中配置“授权回调页” `http://127.0.0.1:8080/weibo_callback`

二、接口调用
* 查看接口文档： 点击“文档” -&gt; &quot;OAuth2.0授权认证&quot;

    接口 | 说明
    OAuth2/authorize | 请求用户授权Token
    OAuth2/access_token | 获取授权过的Access Token, UID


三、接口的使用
  OAuth2/authorize : 生成超链接，跳转到微博，让用户扫码登录（输入用户名、密码登录）
  url = &quot;https://api.weibo.com/oauth2/authorize?client_id=appkey&amp;redirect_uri=微博中配置的回调地址&quot;
  同意授权后会重定向
  http://www.example.com/response&amp;code=CODE


  VUE中编写回调接口,获取userToken
    http://127.0.0.1:8080/weibo_callback
  获取userToken,微博回调的Code
    this.$route.query[&quot;code&quot;];

  将Code发送到Django接口

    &lt;script&gt;
        export default {
            name: &quot;weibo_callback&quot;,
          data:function () {
              return {
                  token:&quot;&quot;
              }
          },
          mounted() {
              this.token = this.$route.query[&quot;code&quot;];

              this.axios({
              url: &quot;/api/app/weibo_login/&quot;,
              method: &quot;post&quot;,
              data:{&quot;token&quot;: this.token}
            }).then(res=&gt;{
              if(res.data.code==200){

              }
              else{

              }
            })
          }
        }
    &lt;/script&gt;


OAuth2/access_token 应，获取Uid(微博账号在新浪中到用户id)

    A  | 必选 | 类型及范围  |	说明
  client_id |	true    |   	string|	申请应用时分配的AppKey。
  client_secret |	true    |	string | 	申请应用时分配的AppSecret。
  grant_type |	true |	string | 	请求的类型，填写authorization_code
  code | 	true |	string	| 调用authorize获得的code值。
  redirect_uri | 	true |	string | 	回调地址，需需与注册应用里的回调地址一致。



接口返回值到官方例子

 {
       &quot;access_token&quot;: &quot;ACCESS_TOKEN&quot;,
       &quot;expires_in&quot;: 1234,
       &quot;remind_in&quot;:&quot;798114&quot;,
       &quot;uid&quot;:&quot;12341234&quot;
 }





    def post(self, request):
        code = request.data.get(&quot;token&quot;)
        
        # 获取uid,接口地址
        url = &quot;https://api.weibo.com/oauth2/access_token&quot;
        
        # 参数，具体含义见上表
        params = {
            &quot;client_id&quot;: &quot;2573333788&quot;,
            &quot;client_secret&quot;: &quot;fa96084f0937f1ef9a4cee5737895556&quot;,
            &quot;grant_type&quot;: &quot;authorization_code&quot;,
            &quot;code&quot;: code,
            &quot;redirect_uri&quot;: &quot;http://127.0.0.1:8080/weibo_callback&quot;
        }

        response = requests.post(url, params).text

        # 1、 从response中获取uid
        dict = json.loads(response)

        weibo_userid = dict[&quot;uid&quot;]

        # 2、 于本地数据库用的用户表做关联（微博绑定表）



        return Response(weibo_userid)


四、微博绑定
  将本地用户，与微博的uid绑定
  * 创建微博绑定表：uid(微博id)、user(用户外键)、type（三方类型）
  * request: 获取uid； response: 返回uid
  * vue创建微博绑定的页面（与注册页类似）。提交时：username、password、uid.
  * django接口，将用户名、密码，写入到用户表。将uid写入微博绑定表
  * django接口返回：登录成功、用户的Id



</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2019-05-08T18:12:31&#43;08:00">
            8 May 2019
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/jiami/">md5加密</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>md5加密：
    #导入加密库
    import hashlib

    # md5加密方法
    def make_password(mypass):
        # 生成md5对象
        md5 = hashlib.md5()
        # 转码操作
        mypass_utf8 = str(mypass).encode(encoding='utf-8')
        # 加密操作
        md5.update(mypass_utf8)
        # 返回密文
        return md5.hexdigest()

    # 注册调用加密
    class Register(APIView):
        def get(self, request):
            # 接收参数
            username = request.GET.get('username', None)
            password = request.GET.get('password', None)

            # 排重操作
            user = User.objects.filter(username=username).first()
            if user:
                return Response({'code': 403, 'message': '该用户名已存在'})

            # 入库
            user = User(username=username, password=make_password(password), phone=phone)

            # 保存结果
            user.save()

            return Response({'code': 200, 'message': '恭喜注册成功'})


</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2018-04-24T18:48:54&#43;08:00">
            24 Apr 2018
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/t/">语法</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <pre><code>v-model:
    v-model是用于表单输入的数据双向绑定。所谓双向绑定就是视图层的数据变化会引起数据层数据的改变，相反的，数据层的变化也会导致视图层展示数据的变化。

class绑定：
    &lt;div :class=&quot;{ active:isActive }&quot;&gt;动态添加class&lt;/div&gt;
    &lt;div :class=&quot;classObj&quot;&gt;class绑定对象&lt;/div&gt;
    &lt;div :class=&quot;classArray&quot;&gt;class绑定数组&lt;/div&gt;
    &lt;div :class=&quot;active:isActive&quot;&gt;class绑定计算，isActive是一个计算&lt;/div&gt;
条件渲染：
    v-if; v-else if; v-else


v-show可以做频繁重复性的显示/隐藏交替设置
    &lt;h1 v-show=&quot;ok&quot;&gt;v-show指令也可以控制显示隐藏元素&lt;/h1&gt;

v-show和v-if的区别：
    v-show会渲染dom树，其元素的display属性受条件的控制显示隐藏元素；
    v-show不支持template元素
    v-if根据条件判断是否渲染dom数

列表渲染：v-for的优先级大于v-if
    &lt;ul&gt;
        &lt;li v-for=&quot;(item,index) in tlist&quot;&gt;
            {{item.text}}}
        &lt;/li&gt;
    &lt;/ul&gt;

v-text:
    将内容按照文本格式进行插入，但会覆盖原有标签内的内容，不会有加载的闪烁问题.

v-html:
    将内容按照html格式进行插入.

v-clock:
    解决加载时的闪烁问题,这个指令可以隐藏未编译的标签直到实例准备完毕
绑定属性.

v-bind:
    可缩写为：:bind

v-on :
    用于监听事件，如按钮的点击事件。v-on 的简写为 @,如下面的 @click 就等价为 v-on:click。


</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2018-04-11T17:34:50&#43;08:00">
            11 Apr 2018
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/jl/">简历</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <h3 id="个人简历">个人简历</h3>
<pre><code>姓 名： 付佳康     性 别： 男
工作经验： 3年         联系电话： 133-5051-5570
E-mail: fu11080709@163.com     现居地址 ： 北京市
#教育背景：
2015:09-2017:06      国家开放大学
工作经历：
2018.06 – 2020.05      瑞友科技
2017.07 – 2018.05      国际禾木教育

专业技能：
编程语言：Python、GO

框架：Django、Flask、Tornado、 Vue、JavaScrip、jQuery

数据库：MySQL、MongoDB、Redis

协议：TCP/IP、HTTP/HTTPS、Websocket

其它：熟练 Git 版本管理、熟悉项目开发流程、了解docker、曾研究百度云人工智能语音技术与文字识别技术等

项目经历：
乐美汇
项目描述
该项目是一个基于Django框架开发的一款定制平台的电商网站。随着互联网的发展，电商行业发展迅速，各种商城网站层出不穷。为了提高乐美汇商城的影响力，本公司为其开发一款网站商城，商城完成从用户登录注册，挑选商品，搜索，下单，支付的全部流程。会员可以在商场浏览商品，在线与客服沟通询问，下订单。以及参加各种商品活动。
项目职责
●负责网站页面数据的展示，为前端提供数据
●负责网站个人信息模块的实现，包含登录与注册功能
●负责网站订单模块功能的编写
●负责网站购物车模块功能的编写，完成商品添加、删除、修改、购买等操作

壹玖旅游APP
项目描述：
壹玖旅游是一款精品涵盖国内外长短旅游路线推送的一个手机应用软件。涵盖会员注册、旅游游记、旅游线路推荐和土特产经营的一个综合性旅游平台。平台提供VIP服务，VIP用户在选择长短线路，选购土特产及参与公司各类活动时具有优惠及特权。
项目职责：
实现三方及多账号登录，通过JWT实现SSO，集成微博、微信等三方社交平台
集成第三方支付接口，使用AiPay等接口实现平台下对于土特产购买的支付、退款功能
完成用户在平台对于土特产的下单购买，维护订单部分，使用redis构建订单缓存

壹玖旅游后台管理系统
项目描述：
本系统主要是为了提高工作效率，实现内部人员的管理，交流，消息 通知，流程审批等功能。
项目职责：
基于Django+Vue前后端分离模式实现系统
负责内部人员管理模块、发帖模块、评论模块的开发
使用DRF框架及serlizer序列化器完成后端接口

自我评价：
我性格外向，活泼开朗，随和乐观，积极向上，爱好广泛，喜欢钻研
适应能力强，能够快速适应工作环境，有很好的自学能力
沟通能力强，为人感情细腻，有良好的人际交往，组织和团队协作能力
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2018-01-08T22:17:43&#43;08:00">
            8 Jan 2018
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/django/">Django项目</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <h3 id="手动创建django项目">手动创建Django项目</h3>
<pre><code>1.首先在终端窗口中 创建一个工程文件 
    Django-admin startproject 项目名

2.然后切换到该文件夹下在创建一个
    Djiango-admin startapp 应用名的确立

3.启动测试服务
    python manange.py runserver   Ip

4.Djiango项目 简单的配置
    INSTALLED_APPS = [                      
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'myapp',  添加创建的app
    ]

5.把app添加setting 配置文件中 相当于falsk工程数据的分析config 主要完成对配置文件的修改 

6.给项目添加项目模板 手动创建一个templates 文件要于下面的相同
    TEMPLATES=[
        {
        'DIRS': [os.path.join(BASE_DIR, &quot;templates&quot;)],    
        }
    ]  

7.配置数据库

8.其他的配置 关于数据库时间的设计

在视图中的运行 
    1.视图函数 写到views.py

    2在url.py配置路径与函数的映射

    3.在视图函数中返回模板
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2018-01-08T21:17:30&#43;08:00">
            8 Jan 2018
        </time>
    </footer>
</article>

    
        
<article class="post ">
    <header class="post-header">
        <h2 class="post-title"><a href="/my_technology/one/">Python</a></h2>
    </header>
    <section class="post-excerpt">
      <p>
          <section class="post-content">
            <h3 id="python2-和-python3-的区别">Python2 和 Python3 的区别</h3>
<pre><code>
1：打印时，py2需要可以不需要加括号，py3 需要 python 2

&gt;   &gt;print ('lili')   ,   print 'lili'


python 3

&gt;   &gt;print ('lili') 

python3 必须加括号

exec语句被python3废弃，统一使用exec函数

2：内涵 :
    &gt;Python2：1.臃肿，源码的重复量很多。 2.语法不清晰，掺杂着C，php，Java，的一些陋习。 
    &gt;Python3：几乎是重构后的源码，规范，清晰，优美。

3、输出中文的区别 python2：要输出中文 需加 # -- encoding:utf-8 -- Python3 ： 直接搞

4：input不同 python2 ：raw_input python3 ：input 统一使用input函数

5：指定字节 python2在编译安装时，可以通过参数—–enable-unicode=ucs2 或—–enable-unicode=ucs4分别用于指定使用2个字节、4个字节表示一个unicode； python3无法进行选择，默认使用 ucs4 查看当前python中表示unicode字符串时占用的空间：

impor sys print（sys.maxunicode） #如果值是65535，则表示使用usc2标准，即：2个字节表示 #如果值是1114111，则表示使用usc4标准，即：4个字节表示

6：py2：xrange 　　　　range py3：range 统一使用range，Python3中range的机制也进行修改并提高了大数据集生成效率

7：在包的知识点里 包：一群模块文件的集合 + init 区别：py2 ： 必须有__init__ 　　　py3：不是必须的了

8：不相等操作符&quot;&lt;&gt;&quot;被Python3废弃，统一使用”!=”

9：long整数类型被Python3废弃，统一使用int

10：迭代器iterator的next()函数被Python3废弃，统一使用next(iterator)

11：异常StandardError 被Python3废弃，统一使用Exception

12：字典变量的has_key函数被Python废弃，统一使用in关键词

13：file函数被Python3废弃，统一使用open来处理文件，可以通过io.IOBase检查文件类型
</code></pre>
          </section>
      </p>
      
    </section>
    <footer class="post-meta">
        
            <img class="author-thumb" src="/my_technology/images/user.png" alt="Author image" nopin="nopin" />
        
        
            付佳康
        
        
        <time class="post-date" datetime="2017-12-11T18:20:33&#43;08:00">
            11 Dec 2017
        </time>
    </footer>
</article>

    

    <nav class="pagination" role="navigation">
	
	    <a class="newer-posts" href="/my_technology/page/2/">&larr; Newer Posts</a>
	
	<span class="page-number">Page 3 of 3</span>
	
</nav>


</main>

    <footer class="site-footer clearfix">
        <section class="copyright"><a href="">我的博客</a> </section>
        
        <section class="poweredby">Proudly generated by <a class="icon-hugo" href="https://gohugo.io">HUGO</a>, with <a class="icon-theme" href="https://github.com/syui/hugo-theme-air">hugo-theme-air</a> theme</section>
        
    </footer>
    </div>
    <script type="text/javascript" src="/my_technology/js/jquery.js"></script>
    <script type="text/javascript" src="/my_technology/js/jquery.fitvids.js"></script>
    <script type="text/javascript" src="/my_technology/js/index.js"></script>
    <script src="/my_technology/js/particles.min.js"></script>
    <script src="/my_technology/js/particles.js"></script>  

</body>
</html>

